package com.itheima.filter;

import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


//@WebFilter("/emp/*")
public class Demo1Filter implements Filter {
    private Object Token;

/*
* 完成功能：Filter入门
*           1）：实现Filter接口，import(导包是java.servlet.Filter)然后重写接口Filter里面的方法
*           2）：方法上添加注解@webFilter("/*")--里面/*代表拦截所有请求
            //这个注解加在 TliasWebManagementApplication（应该是启动类）
            //因为Filter是servlet里面的东西，但是为了让Spring识别Filter所以需要将注解加入TliasWebManagementApplication里面
            //这个注解就是@ServletComponentScan
            3)：启动类里面添加@ServletCompanentScan
             //下面就是过滤器的执行流程，拦截路径，过滤器链
             4）如果有多个过滤器的话：
             执行的顺序过程：
             5）：先去执行第一个过滤器的前置逻辑
             6）：再去执行第二个过滤器的前置逻辑
             7）：doFilter()执行方法
             8）：第三去执行第一个过滤器的后置逻辑
             9）：第四去执行第二个过滤器的后置逻辑

             注意：filterChain.dofilter(servletRequest request, servletResponse respone)
                这个方法指的就是dofilter()方法--表示放行
              关于过滤器执行优先执行哪一个过滤器（拦截器）就是根据名称自然排序

            10):最后就是@WebFilter注解关于拦截路径的问题
            情况 ：1）：@WebFilter("/*")括号里面的/*代表发来的任何请求全部都会拦截
                     2）：@WebFilter("/login")括号里面的/login指的就是会单独拦截这个页面
                          3）：@WebFilter("/emp/demo")这个就是路径的方式拦截，但是这个只会拦截emp下面的子路径，不会拦截emp这个大的页面路径
 */


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("1初始化方法，项目启动启动时执行，执行一次，一般用于初始化资源");
    }


    /*Requset接收请求    Response响应请求的详解

*ServletRequset：接受请求----它其实就是HttpServletRequest的子类（子类的方法比父类的方法要多）
*问题是现在为啥要将servletRequuset转换为子类，因为拦截器要去拦截前段发来的请求，因为父类里面方法没有获取接收请求路径方法，所以需要强转
*请求会被tomcat封装为HttpServletRequest，Servlet是HttpServletRequset的父类
ServletReaponse道理如此

注意一点就是：这些逻辑代码要写在doFilter()方法里面，来去执行
*/
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("1拦截器每拦截一次，就会执行一次");
        //这里放行前的逻辑就是指的是前端请求后端数据，进行查看分析，看一下前端需要哪些资源，知道后放行
        System.out.println("1放行前的逻辑....");
        //放行--指的是前段发来请求进行拦截检查
        filterChain.doFilter(servletRequest ,servletResponse);
        System.out.println("1放行前的逻辑....");
        //现在这里面的逻辑就是--拿到数据后Filter会进行数据检查，多的不让你拿走的意思

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //现在就是获取路径(接收请求)getRequestURL()方法
        String requesturi =  request.getRequestURI();
        StringBuffer requesturl =   request.getRequestURL();
        //目的就是查看有什么不同
        System.out.println(requesturl);
        System.out.println(requesturi);
       //获取请求头
        request.getHeader("Token");

        /*
        * 3)如何获取诗求路径
            string uri = request,getReguestURI();// emps
            string url = request.getRequestuRL(),tostring(); //http://localhost:8080/emps
          4)如何鸭újson 数据
            1)JsoNobject 是fastison 工具包提供的快捷的转ison 的工具
            对象转字符串
                string jsonstr =JsoNobject.tojsoNstring(result);
         字符转对象
            Result result1 =jsonobject.parseobject(jsonstr, Result.class):
        *
        * */
        //响应数据
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //现在就是获取路径(接收请求)getRequestURL()方法
        request.getRequestURI();
        //现在就是给浏览器如何相应json类型的数据
        //就是如果数据响应的类型为id msg data 这种为Result的响应形式
        //那么Result是必不可少的


        Result reslut =Result.error("错误");
        //导入的依赖里面有个fastjson里面的api方法里面就有一个jsonObject就是将普通数据格式转换为json格式

        String jsonStr =JSONObject.toJSONString(reslut);

        //现在就是将Object格式的数据转换为JSON数据
        Result result =JSONObject.parseObject(jsonStr,Result.class);
        //告知浏览器响应的数据为json
        response.setContentType("application/json");
        response.getWriter().write(JSONObject.toJSONString(reslut));

    }

    @Override
    public void destroy() {
        System.out.println("1销毁方法，项目关闭时执行，执行一次一般用于销毁资源");
    }


}
